#! /bin/sh

# 用途：拷贝程序/库所依赖的库文件
# 作者:huanlf AT gmail.com
# GPL v2

# ldd
get_so(){
    ldd $1 | awk '{ if ($3 ~ /^\//){ print $3 } else if ($1 ~ /^\//){ print $1 } }'
}

# 取得并拷贝符号链接
get_link(){
    local sym_link=$( readlink $1 )
    
    # 防止相对路径
    case $sym_link in
        /*)
        ;;
        *) 
        sym_link=${1%/*}/$sym_link
        ;;
    esac

    local sym_path=${sym_link%/*}

    [ -d $dst/$sym_path ] || mkdir $dst/$sym_path
    [ -e $dst/$sym_link ] || cp -a $sym_link $dst/$sym_link
    
    # 再次检查链接
    [ -h $sym_link ] && get_link $sym_link
}

# 取得并拷贝依赖的so库文件
get_ldd(){
    local so
    for so in $( get_so $1 ); do
        path=${so%/*}
        [ -d $dst/$path ] || mkdir -p $dst/$path
        [ -e $dst/$so ]   || cp -a $so $dst/$so

        ## 递归检查依赖
        [ -h $so ] && get_link $so || get_ldd $so
    done
}


# -------------main----------------
if [ "$#" != 2 ]; then
    echo "用法: get_ldd  程序 目标文件夹"
    echo
    exit
fi

app=$1; shift
dst=$1; shift

case $app in
    ./*|/*)
    ;;
    *) 
    [ -f $app ] || app=`which $app`
    ;;
esac

[ -z $app ] && {
    echo "没有找到$app"
    exit 1
}

mkdir -p $dst || exit $?

[ -e "${dst}/$(dirname $app)" ] || mkdir -p ${dst}/$(dirname $app)
[ -e "${dst}/$app" ] || cp $app ${dst}/$(dirname $app)

## 开始查找so
get_ldd $app
